﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using BLevy.Negocio;
using BLevy.Entidad;

namespace BLevy.UI.Socios
{
    public partial class frmSociosABM : Form
    {
        private static Usuario usuario;

        //formulario padre
        private frmPrincipal parent = null;

        public frmSociosABM()
        {
            InitializeComponent();

            //usuario = _usr;
        }

        private void IniciarControles()
        {
            txtApellido.Text = string.Empty;
            txtDocumento.Text = string.Empty;
            txtNroSocio.Text = string.Empty;
            txtNombres.Text = string.Empty;

            dgvSocios.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            cmbLocalidad.Enabled = false;
            cmbZona.Enabled = false;
            cboFormaPago.Enabled = false;

            txtDocumento.Enabled = false;
            txtApellido.Enabled = false;
            txtNombres.Enabled = false;

            this.ActiveControl = txtNroSocio;
        }

        private void frmSociosABM_Load(object sender, EventArgs e)
        {
            IniciarControles();
            GetLocalidades();
            FindFormasPago();
            //GetSocios();

            //traigo el formulario padre
            parent = (frmPrincipal)this.MdiParent;
        }

        private void GetLocalidades()
        {
            try
            {
                cmbLocalidad.DisplayMember = "localidad";
                cmbLocalidad.ValueMember = "id";
                cmbLocalidad.DataSource = Localidades.FindAll();

                if (cmbLocalidad.Items.Count != 0)
                {
                    GetZonasPorLocalidad(Convert.ToInt32(cmbLocalidad.SelectedValue));
                }
                else
                {
                    cmbZona.DataSource = null;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void GetZonasPorLocalidad(int localidad_id)
        {
            try
            {
                cmbZona.ValueMember = "id";
                cmbZona.DisplayMember = "zona";
                cmbZona.DataSource = Negocio.Zonas.FindAllPorLocalidad(localidad_id);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            frmSocios frm = new frmSocios();
            frm.MdiParent = this.MdiParent;
            frm.Show();
        }

        private void GetSocios()
        {
            try
            {
                var query = (from row in Negocio.Socios.FindAllConLocalidadZonaPlan()
                             select new
                             {
                                 row.id,
                                 Cert = row.numero_certificado,
                                 fecha_ingreso = row.fecha_ingreso.ToShortDateString(),
                                 row.documento,
                                 row.apellido,
                                 row.nombres,
                                 fecha_nacimiento = row.fecha_nacimiento.ToShortDateString(),
                                 row.localidad.localidad,
                                 row.zona.zona,
                                 plan = row.plan.nombre,
                                 row.activo
                             }).ToList();

                dgvSocios.Rows.Clear();
                foreach (var fila in query)
                {
                    dgvSocios.Rows.Add(fila.id, fila.Cert, fila.fecha_ingreso, fila.documento, fila.apellido, fila.nombres, fila.fecha_nacimiento, fila.localidad, fila.zona, fila.plan, fila.activo);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            Filtrar();

            //int? localidad_id = null;
            //int? zona_id = null;

            //if(ckbLocalidadZona.CheckState == CheckState.Checked)
            //{
            //    localidad_id = Convert.ToInt32(cmbLocalidad.SelectedValue);
            //    zona_id = Convert.ToInt32(cmbZona.SelectedValue);
            //}

            //FiltrarForm(txtNroSocio.Text, txtDocumento.Text, txtApellido.Text, localidad_id, zona_id);
        }

        //private void FiltrarForm(string nroSocio, string documento, string apellido, int? localidad_id, int? zona_id)
        //{
        //    var query = (from row in Negocio.Socios.FindAllConLocalidadZonaPlan()
        //                 where ((row.numero_certificado == Convert.ToInt32("0" + nroSocio)) || (nroSocio.Equals(string.Empty))) &&
        //                 ((row.documento.Contains(documento)) || (documento.Equals(string.Empty))) && 
        //                 ((row.apellido.Contains(apellido)) || (apellido.Equals(string.Empty))) &&
        //                 ((row.localidad.id == localidad_id) || (localidad_id == null)) &&
        //                 ((row.zona.id == zona_id) || (zona_id == null))
        //                 orderby row.numero_certificado ascending
        //                 select new
        //                 {
        //                     row.id,
        //                     row.numero_certificado,
        //                     fecha_ingreso = row.fecha_ingreso.ToShortDateString(),
        //                     row.documento,
        //                     row.apellido,
        //                     row.nombres,
        //                     fecha_nacimiento = row.fecha_nacimiento.ToShortDateString(),
        //                     row.localidad.localidad,
        //                     row.zona.zona,
        //                     plan = row.plan.nombre,
        //                     row.activo
        //                 }).ToList();

        //    dgvSocios.Rows.Clear();
        //    foreach (var fila in query)
        //    {
        //        dgvSocios.Rows.Add(fila.id, fila.numero_certificado, fila.fecha_ingreso, fila.documento, fila.apellido, fila.nombres, fila.fecha_nacimiento,  fila.localidad, fila.zona, fila.plan, fila.activo);
        //    }

        //    PintarGrilla();
        //}

        private void txtDocumento_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back))
            {
                error.SetError(ckbDocumento, "Solo se permiten números en el campo documento.");
                e.Handled = true;
                return;
            }
        }

        private void txtNroSocio_KeyPress(object sender, KeyPressEventArgs e)
        {
            error.Clear();
            if (!(char.IsNumber(e.KeyChar)) && (e.KeyChar != (char)Keys.Back))
            {
                error.SetError(txtNroSocio, "Solo se permiten números en el campo Nro. Socio.");
                e.Handled = true;
                return;
            }
        }

        private void btnNuevo_Click_1(object sender, EventArgs e)
        {
            frmSocios frm = new frmSocios();
            frm.MdiParent = this.MdiParent;
            frm.Show();
        }

        private void btnNuevo_Click_2(object sender, EventArgs e)
        {

            if (Convert.ToBoolean(parent.usuario.rol.permisos.insertar) == true)
            {
                frmGruposFamiliares frm = new frmGruposFamiliares();
                frm.MdiParent = this.MdiParent;
                frm.Show();
            }
            else
            {
                MessageBox.Show("No tiene privilegios para realizar la operación", "Información", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void txtApellido_TextChanged(object sender, EventArgs e)
        {
            Filtrar();
            //int? localidad_id = null;
            //int? zona_id = null;

            //if (ckbLocalidadZona.CheckState == CheckState.Checked)
            //{
            //    localidad_id = Convert.ToInt32(cmbLocalidad.SelectedValue);
            //    zona_id = Convert.ToInt32(cmbZona.SelectedValue);
            //}

            //FiltrarForm(txtNroSocio.Text, txtDocumento.Text, txtApellido.Text, localidad_id, zona_id);
        }

        private void txtDocumento_TextChanged(object sender, EventArgs e)
        {
            Filtrar();
            //int? localidad_id = null;
            //int? zona_id = null;

            //if (ckbLocalidadZona.CheckState == CheckState.Checked)
            //{
            //    localidad_id = Convert.ToInt32(cmbLocalidad.SelectedValue);
            //    zona_id = Convert.ToInt32(cmbZona.SelectedValue);
            //}

            //FiltrarForm(txtNroSocio.Text, txtDocumento.Text, txtApellido.Text, localidad_id, zona_id);
        }

        private void txtNroSocio_TextChanged(object sender, EventArgs e)
        {
            Filtrar();

            //int? localidad_id = null;
            //int? zona_id = null;

            //if (ckbLocalidadZona.CheckState == CheckState.Checked)
            //{
            //    localidad_id = Convert.ToInt32(cmbLocalidad.SelectedValue);
            //    zona_id = Convert.ToInt32(cmbZona.SelectedValue);
            //}

            //FiltrarForm(txtNroSocio.Text, txtDocumento.Text, txtApellido.Text, localidad_id, zona_id);
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (dgvSocios.Rows.Count > 0)
            {
                if (Convert.ToBoolean(parent.usuario.rol.permisos.eliminar) == true)
                {
                    try
                    {
                        int socio_id = Convert.ToInt32(dgvSocios.CurrentRow.Cells[0].Value);
                        string socio = dgvSocios.CurrentRow.Cells[4].Value.ToString() + ", " + dgvSocios.CurrentRow.Cells[5].Value.ToString();
                        string codigo = dgvSocios.CurrentRow.Cells[1].Value.ToString();

                        DialogResult DialogEliminar = MessageBox.Show("Se va a dar de baja el Grupo Familiar: (" + codigo + " - Titular: " + socio + "), está seguro?", "Advertencia", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (DialogEliminar == System.Windows.Forms.DialogResult.Yes)
                        {

                            frmSocioBaja frm = new frmSocioBaja(socio_id);
                            frm.Text = "Baja de Grupo Familiar: (" + codigo + " - Titular: " + socio + ")";
                            frm.ShowDialog();
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show("No tiene privilegios para realizar la operación", "Información", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnDetalles_Click(object sender, EventArgs e)
        {
            if (dgvSocios.Rows.Count > 0)
            {
                try
                {
                    int socio_id = Convert.ToInt32(dgvSocios.CurrentRow.Cells[0].Value);
                    string socio = dgvSocios.CurrentRow.Cells[4].Value.ToString() + ", " + dgvSocios.CurrentRow.Cells[5].Value.ToString();
                    string codigo = dgvSocios.CurrentRow.Cells[1].Value.ToString();

                    frmGruposFamiliares frm = new frmGruposFamiliares(socio_id, "DETALLE");
                    frm.MdiParent = this.MdiParent;
                    frm.Text = "Grupos Familiares ABM - Detalle de Grupo: " + codigo + " - Titular: " + socio;
                    frm.Show();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (dgvSocios.Rows.Count > 0)
            {
                if (Convert.ToBoolean(parent.usuario.rol.permisos.modificar) == true)
                {
                    try
                    {
                        int socio_id = Convert.ToInt32(dgvSocios.CurrentRow.Cells[0].Value);
                        string socio = dgvSocios.CurrentRow.Cells[4].Value.ToString() + ", " + dgvSocios.CurrentRow.Cells[5].Value.ToString();
                        string codigo = dgvSocios.CurrentRow.Cells[1].Value.ToString();

                        frmGruposFamiliares frm = new frmGruposFamiliares(socio_id, "EDITAR");
                        frm.MdiParent = this.MdiParent;
                        frm.Text = "Grupos Familiares ABM - Modificación de Grupo: " + codigo + " - Titular: " + socio;
                        frm.Show();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show("No tiene privilegios para realizar la operación", "Información", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }

        //private void ckbActivos_CheckedChanged(object sender, EventArgs e)
        //{
        //    int? localidad_id = null;
        //    int? zona_id = null;

        //    if (ckbLocalidadZona.CheckState == CheckState.Checked)
        //    {
        //        localidad_id = Convert.ToInt32(cmbLocalidad.SelectedValue);
        //        zona_id = Convert.ToInt32(cmbZona.SelectedValue);
        //    }

        //    FiltrarForm(txtNroSocio.Text, txtDocumento.Text, txtApellido.Text, localidad_id, zona_id); ; 
        //}

        private void frmSociosABM_Activated(object sender, EventArgs e)
        {
            //GetSocios();
        }

        private void cmbLocalidad_SelectionChangeCommitted(object sender, EventArgs e)
        {
            GetZonasPorLocalidad(Convert.ToInt32(cmbLocalidad.SelectedValue));
        }

        private void ckbLocalidadZona_CheckedChanged(object sender, EventArgs e)
        {
            if (ckbLocalidadZona.CheckState == CheckState.Checked)
            {
                cmbLocalidad.Enabled = true;
                cmbZona.Enabled = true;

                cmbLocalidad.Focus();
            }
            else
            {
                cmbLocalidad.Enabled = false;
                cmbZona.Enabled = false;

                cmbLocalidad.SelectedIndex = -1;
                cmbZona.SelectedIndex = -1;
            }
        }

        private void PintarGrilla()
        {
            foreach (DataGridViewRow row in dgvSocios.Rows)
            {
                if (Convert.ToBoolean(row.Cells[12].Value) == false)
                {
                    row.DefaultCellStyle.BackColor = Color.GreenYellow;
                }
            }
        }

        private void dgvSocios_DoubleClick(object sender, EventArgs e)
        {
            try
            {
                int socio_id = Convert.ToInt32(dgvSocios.CurrentRow.Cells[0].Value);
                string socio = dgvSocios.CurrentRow.Cells[4].Value.ToString() + ", " + dgvSocios.CurrentRow.Cells[5].Value.ToString();
                string codigo = dgvSocios.CurrentRow.Cells[1].Value.ToString();

                frmGruposFamiliares frm = new frmGruposFamiliares(socio_id, "DETALLE");
                frm.MdiParent = this.MdiParent;
                frm.Text = "Grupos Familiares ABM - Detalle de Grupo: " + codigo + " - Titular: " + socio;
                frm.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private void Filtrar()
        {
            string nrosocio = txtNroSocio.Text == string.Empty ? null : txtNroSocio.Text;
            string documento = txtDocumento.Text == string.Empty ? null : txtDocumento.Text;
            string apellido = txtApellido.Text == string.Empty ? null : txtApellido.Text;
            string nombres = txtNombres.Text == string.Empty ? null : txtNombres.Text;


            int? localidad_id = ckbLocalidadZona.Checked ? (int?)cmbLocalidad.SelectedValue : null;
            int? zona_id = ckbLocalidadZona.Checked ? (int?)cmbZona.SelectedValue : null;
            int? formapago_id = chkFormaPago.Checked ? (int?)cboFormaPago.SelectedValue : null;

            int? dosperiodos = chkDosPeriodos.Checked ? (int?)2 : null;
            int? tresperiodos = chkTresPeriodos.Checked ? (int?)3 : null;

            try
            {
                var query = (from row in Negocio.Socios.FindAllFiltro(nrosocio, documento, apellido, nombres, localidad_id, zona_id, formapago_id, dosperiodos, tresperiodos).Take(100)
                             orderby row.numero_certificado ascending
                             select new
                             {
                                 row.id,
                                 row.numero_certificado,
                                 fecha_ingreso = row.fecha_ingreso.ToShortDateString(),
                                 row.documento,
                                 row.apellido,
                                 row.nombres,
                                 fecha_nacimiento = row.fecha_nacimiento.ToShortDateString(),
                                 row.localidad_id,
                                 row.localidad,
                                 row.zona_id,
                                 row.zona,
                                 row.formapago_id,
                                 formapago = row.forma_pago,
                                 row.plan_id,
                                 row.plan,
                                 row.activo,
                                 row.periodosimpagos
                             }).ToList();

                dgvSocios.Rows.Clear();
                foreach (var fila in query)
                {
                    dgvSocios.Rows.Add(fila.id, fila.numero_certificado, fila.fecha_ingreso, fila.documento,
                        fila.apellido, fila.nombres, fila.fecha_nacimiento, fila.localidad, fila.zona, fila.formapago,
                        fila.plan, fila.periodosimpagos, fila.activo);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            PintarGrilla();
        }

        private void ckbDocumento_CheckedChanged(object sender, EventArgs e)
        {
            if (ckbDocumento.CheckState == CheckState.Checked)
            {
                txtDocumento.Enabled = true;
                txtDocumento.Focus();
            }
            else
            {
                txtDocumento.Enabled = false;
                txtDocumento.Text = string.Empty;
            }

        }

        private void ckbApellido_CheckedChanged(object sender, EventArgs e)
        {
            if (ckbApellido.CheckState == CheckState.Checked)
            {
                txtApellido.Enabled = true;
                txtApellido.Focus();
            }
            else
            {
                txtApellido.Enabled = false;
                txtApellido.Text = string.Empty;
            }
        }

        private void ckbNombres_CheckedChanged(object sender, EventArgs e)
        {
            if (ckbNombres.CheckState == CheckState.Checked)
            {
                txtNombres.Enabled = true;
                txtNombres.Focus();
            }
            else
            {
                txtNombres.Enabled = false;
                txtNombres.Text = string.Empty;
            }
        }

        private void txtNombres_TextChanged(object sender, EventArgs e)
        {
            Filtrar();
        }

        private void btnImprimir_Click(object sender, EventArgs e)
        {
            frmSociosReporteGeneral frm = new frmSociosReporteGeneral(GenerarImpresion());
            frm.MdiParent = this.MdiParent;
            frm.Show();
        }

        private IList<Socio> GenerarImpresion()
        {
            IList<Socio> socios = new List<Socio>();

            try
            {
                foreach (DataGridViewRow row in dgvSocios.Rows)
                {
                    Socio socio = new Socio();
                    socio = Negocio.Socios.FindById(Convert.ToInt32(row.Cells[0].Value));
                    socio.zona = Negocio.Zonas.FindById(socio.zona_id);

                    socios.Add(socio);

                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return socios;
        }

        private void chkFormaPago_CheckedChanged(object sender, EventArgs e)
        {
            if (chkFormaPago.CheckState == CheckState.Checked)
                cboFormaPago.Enabled = true;
            else
                cboFormaPago.Enabled = false;
        }


        private void FindFormasPago()
        {
            try
            {
                cboFormaPago.ValueMember = "id";
                cboFormaPago.DisplayMember = "forma_pago";
                cboFormaPago.DataSource = FormasPagos.FindAll();
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void chkDosPeriodos_CheckedChanged(object sender, EventArgs e)
        {
            if (chkDosPeriodos.CheckState == CheckState.Checked)
            {
                chkTresPeriodos.CheckState = CheckState.Unchecked;
                Filtrar();
            }
        }

        private void chkTresPeriodos_CheckedChanged(object sender, EventArgs e)
        {
            if (chkTresPeriodos.CheckState == CheckState.Checked)
            {
                chkDosPeriodos.CheckState = CheckState.Unchecked;
                Filtrar();
            }
        }

    }
}
